﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SHomeWorkshop.LunarConcept.Controls;
using SHomeWorkshop.LunarConcept.Tools;
using SHomeWorkshop.LunarConcept.Enums;
using System.Windows.Controls;
using System.Xml;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
using SHomeWorkshop.LunarMind;

namespace SHomeWorkshop.LunarConcept.Widgets
{
    /// <summary>
    /// 创建时间：2012年1月2日
    /// 创建者：  杨震宇
    /// 
    /// 主要用途：作为线型部件的基类。这类部件的Canvas左上角的坐标固定在(0,0)，以便避免坐标换算。
    ///           线型部件，目前又分为ShapeWidget和ArrowLineWidget两大类。2012年6月8日
    /// </summary>
    public abstract class LineWidget : Widget
    {
        public LineWidget(PageEditorReader masterPageEditor)
            : base(masterPageEditor)
        {
            this.Child = this.mainCanvas;
        }

        protected LineDashType.DashType lineDash = LineDashType.DashType.Solid;
        [Tools.LunarProperty("LineDash", PropertyDateType.DashType)]
        public LineDashType.DashType LineDash
        {
            get { return lineDash; }
            set
            {
                lineDash = value;
                if (this.xmlData != null)
                {
                    this.xmlData.SetAttribute("LineDash", lineDash.ToString());
                }

                RefreshLineDash();
            }
        }

        public virtual void RefreshLineDash()
        {

        }

        /// <summary>
        /// 线型部件，基板全部尺寸为零。这样可以在线外“穿透”选定。又不影响线的可视状态。
        /// </summary>
        protected Canvas mainCanvas = new Canvas()
        {
            Width = 0,
            Height = 0
        };

        public Canvas MainCanvas
        {
            get { return mainCanvas; }
        }

        /// <summary>
        /// [事实只读]对于LineWidget来说，此属性总是返回OutRect的左上角。
        /// 虽然可以给此属性赋值，但给此属性设置任何值都不会起任何作用。
        /// ——此属性是增添了新接口，为避免大幅度修改此前的代码才添加。2012年5月30日
        /// </summary>
        public Point Location
        {
            get { return TopLeft; }
            set { return; }
        }

        private static Thickness lineWidgetDefaultPadding = new Thickness(0);
        /// <summary>
        /// [读写]线型部件内间距总是０，其实无意义，只是为避免修改此前的一些代码才添加。2012年5月30日
        /// 给此属性设置任何值都不会起任何作用。
        /// 
        /// 2013年3月13日，令ArrowLineWidget支持内间距。
        /// </summary>
        public Thickness WidgetPadding
        {
            get { return lineWidgetDefaultPadding; }
            set { return; }
        }

        public override void Build()
        {
            base.Build();

            if (this.xmlData == null) return;

            //LineWidget类只需要读取WidgetStyle中的LineDash，但它不是任何与Style相关的属性的“最终实现”类。
            //因此，这里不调用任何Refreshxxx()方法。
        }

        /// <summary>
        /// 线型部件才需要。刷新坐标。
        /// </summary>
        public override void RefreshLocation()
        {
            RefreshTextPanelLocatin();
            this.RefreshCommentText();
            this.RefreshHyperLinkText();
        }

        public override Point BottomRight
        {
            get
            {
                return new Point(this.ActualWidth, this.ActualHeight);
            }
        }

        /// <summary>
        /// 按整数将源点的坐标给格式化一下。规则是四舍五入。
        /// </summary>
        /// <param name="pt">源点。</param>
        /// <returns>返回新坐标点。</returns>
        public Point FormatPoint(Point pt)
        {
            return new Point((int)(pt.X + 0.5), (int)(pt.Y + 0.5));
        }
        
        /// <summary>
        /// 复制时取根据相对坐标更改后的各控制点坐标在内的Xml文本。粘贴功能所必须。
        /// </summary>
        /// <param name="relative"></param>
        /// <returns></returns>
        public abstract string GetRelativeOuterXml(Point baseCopyTopLeft);

        public abstract void RefreshPointWhenGroupIn(Point baseTopLeft);

        public abstract void RefreshPointWhenGroupOut(Point baseTopLeft);
    }
}
